BOJ

[Bronze I] 크레이지 타임 - 27161

문제 링크

성능 요약

메모리: 15240 KB, 시간: 120 ms

분류

구현, 시뮬레이션

제출 일자

2025년 8월 6일 07:47:04

문제 설명

우주 어딘가에는 시간을 셈으로써 시간이 흐르도록 만들어 주는 존재들이 있습니다. 영겁의 시간을 살아온 그들은 더 재미있게 시간을 세기 위해 시간을 세는 게임을 만들어 냈답니다. 그게 바로 《크레이지 타임》이죠!

《크레이지 타임》을 시작하기 전에, 시간 카드를 잘 섞은 후 플레이어들이 최대한 비슷한 수량의 카드를 받도록 나눠 가집니다. 시간 카드는 앞면과 뒷면이 구분된 카드로, 앞면에는 시계 그림과 시각이 적혀 있습니다. 시계의 그림은 총 세 가지로, 벽시계, 손목시계, 그리고 모래시계입니다. 그렇게 받은 카드를 뒷면이 보이도록 자기 앞에 쌓아서 개인 더미를 만듭니다.

게임의 진행은 아래과 같습니다.

  1. 플레이어는 자기 차례가 되면 개인 더미의 가장 윗장 카드를 펼치며 이번 순서의 시각을 외칩니다. 첫 플레이어는 "1시"로 시작합니다.
  2. 시계 방향으로 돌아가며 각자의 차례를 가집니다. 다른 방해 요소가 없다면 방금 전에 불린 시각을 기준으로 1시간씩 더해서 외칩니다. 전에 외친 시각이 "12시"라면 다음 사람은 "1시"를 외칩니다.

단, 펼쳐진 카드에 따라 색다른 방식으로 외치거나 행동해야 할 수 있습니다. 다양한 시간의 법칙이 게임에 영향을 미치게 되는데, 기본적으로 다음 2가지 종류의 시간의 법칙을 지켜야 합니다.

  1. 시간 역행의 법칙: 누군가 모래시계 카드를 펼치면 시간이 거꾸로 흐르기 시작합니다. "2시", "1시", "12시" 순으로 외쳐야 합니다. 모래시계 카드가 펼쳐질 때마다 시간의 흐름은 반전됩니다.
  2. 동기화의 법칙: 플레이어가 외친 시각과 펼쳐진 카드에 적힌 시각이 일치하면, 모든 플레이어들은 즉시 손바닥으로 게임판 중앙을 내리쳐야 합니다.

그림 C.1: 시간 역행의 법칙 - 모래시계 카드를 펼치면 시간이 거꾸로 흐르기 시작합니다.

그림 C.2: 동기화의 법칙 - 외친 시각과 펼쳐진 카드에 적힌 시각이 일치하면 게임판 중앙을 내리칩니다.

또한 게임에서 반드시 지켜져야 하는 하나의 원칙이 존재합니다.

  1. 과부하의 원칙: 펼쳐지는 카드가 동시에 2개 이상의 법칙을 발동시킨다면, 그 어떤 법칙도 적용하지 않습니다. 예를 들어, 시간 역행의 법칙과 동기화의 법칙이 동시에 발동되면, 그 어떠한 법칙도 적용하지 않습니다.

잘못된 시각을 외치거나 손바닥을 가장 늦게 내리친 플레이어는 벌점 토큰을 받아 자기 카드 더미 옆에 놓습니다. 벌점 토큰이 주어지고 나면, 플레이어들은 펼쳐진 카드들을 다시 각자의 카드 더미 밑으로 넣습니다. 그런 다음 벌점을 받은 플레이어가 "1시"를 외치며 경기를 재개합니다.

《크레이지 타임》을 너무나도 좋아하는 한별이는 은하에게 이기기 위해 여러분에게 도움을 청했습니다. 한별이는 마법을 써서 다음 차례의 플레이어가 펼칠 카드를 전부 알아냈습니다. 뛰어난 《크레이지 타임》 플레이어인 은하는 절대로 잘못된 시각을 외치지 않기 때문에, 해당 방법으로 벌점 토큰이 주어지지는 않습니다. 또한 동기화의 법칙이 적용되었을 때 모든 플레이어는 정확히 같은 순간에 손바닥을 내리치게 되는데, 누가 마지막으로 내리쳤는지 알기 어렵기 때문에 실제 게임과는 다르게 아무도 벌점 토큰을 받지 않고 게임을 진행하기로 결정하였습니다. 펼쳐질 카드들의 순서가 주어졌을 때, 각 차례의 플레이어가 외쳐야 하는 시각과 해야 하는 행동을 알려주세요.

입력

첫 번째 줄에 펼쳐질 카드의 개수 N이 주어집니다.

두 번째 줄부터 N개의 줄에 걸쳐 한 줄에 하나씩 카드의 정보가 주어집니다.

카드의 정보는 공백으로 구분된, 카드에 그려진 시계의 종류를 나타내는 문자열 S와 카드에 적힌 시간을 나타내는 양의 정수 X로 이루어져 있습니다.

SCLOCK, WATCH, HOURGLASS 중 하나입니다.

CLOCK은 벽시계를, WATCH는 손목시계를, HOURGLASS는 모래시계를 의미합니다.

출력

N줄에 걸쳐 해당 카드를 펼쳤을 때 차례를 진행하는 플레이어가 외쳐야 하는 시각과 해야 하는 행동을 공백으로 구분하여 출력해주세요.

시각은 1부터 12 사이의 정수로, 해야 하는 행동은 게임판 중앙을 내리쳐야 한다면 YES를, 아니면 NO를 출력해주세요.

소스 코드